package com.example.a1.fannong.core.app;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

public abstract class BaseListAdapter<T> extends BaseAdapter {
    public final static String AVATAR_CONTENT_BEFORE= "http://service.zx7c.cn/2013/";
    protected LayoutInflater mInflater;
    protected Context mContext;
    private List<T> mItems;

    public BaseListAdapter(Context context) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
    }

    public BaseListAdapter(Context context, List<T> items) {
        this(context);
        mItems = items;
    }

    @Override
    public int getCount() {
        return mItems == null ? 0 : mItems.size();
    }

    @Override
    public T getItem(int position) {
        if (mItems != null && position >= 0 && position < mItems.size()) {
            return mItems.get(position);
        }
        return null;
    }

    @Override
    public long getItemId(int position) {
        // 默认返回该Item的位置，如果有自己的特别需要，自行覆盖重写该方法
        return position;
    }

    /**
     * 获取实体列表
     */
    public List<T> getItems() {
        return mItems;
    }

    /**
     * 获取第一个Item
     *
     * @return 获取第一个Item，如果数据集为空，则返回null
     */
    public T getFirstItem() {
        return mItems != null && !mItems.isEmpty() ? mItems.get(0) : null;
    }

    /**
     * 获取最后一个Item
     *
     * @return 获取最后一个Item，如果数据集为空，则返回null
     */
    public T getLastItem() {
        return mItems != null && !mItems.isEmpty() ? mItems.get(mItems.size() - 1) : null;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        T item = getItem(position);

        View view;
        if (convertView == null) {
            view = newView(mInflater, position, item, parent);
        } else {
            view = convertView;
        }
        bindView(view, position, item);
        return view;
    }

    /**
     * 创建一个新的视图
     *
     * @param inflater LayoutInflater
     * @param position 当前位置
     * @param item     当前位置对应的数据对象
     * @param parent   父视图
     * @return 最新创建的视图
     */
    public abstract View newView(LayoutInflater inflater, int position, T item, ViewGroup parent);

    /**
     * 绑定当前item数据到一个已存在的视图
     *
     * @param view     现有的视图，从 {@link #newView(LayoutInflater, int, Object, ViewGroup)}获取
     * @param position 当前位置
     * @param item     当前位置对应的数据对象
     */
    public abstract void bindView(View view, int position, T item);

    /**
     * 获取当前Adapter绑定的Context实例
     */
    public Context getContext() {
        return mContext;
    }

    /**
     * 改变实体列表，并通知数据已改变。如果原来存在数据，将对其进行覆盖。
     *
     * @param newItems 新的items
     * @return 原来的items或null
     */
    public List<T> changeItems(List<T> newItems) {
        return changeItems(newItems, false);
    }

    public List<T> changeItems(List<T> newItems, boolean invalidate) {
        if (newItems == mItems) {
            if (invalidate)
                notifyDataSetInvalidated();
            else
                notifyDataSetChanged();
            return null;
        }

        List<T> oldItems = mItems;
        mItems = newItems;
        if (newItems != null && !invalidate) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }

        return oldItems;
    }

    /**
     * 销毁数据
     */
    public void destroy() {
        mItems = null;
    }

}
